#include "buzzer.h"
#include "stm32f429xx.h"

#define BUZZER_MAX_COUNTER		85

void BuzzerInit(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	BUZZER_RCC_ENABLE;
	BUZZER_TIMER_ENABLE;
	GPIO_InitStruct.Pin = BUZZER_PIN;
	GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	HAL_GPIO_Init(BUZZER_PORT, &GPIO_InitStruct);
	BUZZER_TIMER->CCER |= TIM_CCER_CC1E;
	BUZZER_TIMER->DIER |= TIM_DIER_UIE;
	BUZZER_TIMER->PSC = 0x500;
	BUZZER_TIMER->ARR = 0x10;
	HAL_NVIC_EnableIRQ(BUZZER_TIMER_IRQn);
	HAL_NVIC_SetPriority(BUZZER_TIMER_IRQn, 14, 0);
	BuzzerON_Once();
}

void BuzzerON_Error(void)
{
	BUZZER_TIMER->CR1 |= TIM_CR1_CEN;
	BUZZER_TIMER->SR = 0;
	buzzer.state = E_Buzzer_On_error;
}

void BuzzerON_Once(void)
{
	BUZZER_TIMER->CR1 |= TIM_CR1_CEN;
	BUZZER_TIMER->SR = 0;
	buzzer.state = E_Buzzer_On_once;
}

void BuzzerOff(void)
{
	BUZZER_TIMER->CR1 &=~ TIM_CR1_CEN;
	BUZZER_TIMER->SR = 0;
	buzzer.state = E_Buzzer_Off;
}

void BUZZER_TIMER_IRQHandler(void)
{
	if(BUZZER_TIMER->SR & TIM_SR_UIF)
	{
		if(buzzer.state == E_Buzzer_Off)
		{
			BuzzerOff();
		}
		if((buzzer.state == E_Buzzer_On_error)||(buzzer.state == E_Buzzer_ON_error_Pause))
		{
			buzzer.counter ++;

			if(buzzer.state == E_Buzzer_On_error)
				BUZZER_PORT->ODR ^= BUZZER_PIN;
			if(buzzer.state == E_Buzzer_ON_error_Pause)
			{
				BUZZER_PORT->ODR |= BUZZER_PIN;
			}
			if(buzzer.counter > BUZZER_MAX_COUNTER)
			{
				if(buzzer.state == E_Buzzer_On_error)
					buzzer.state = E_Buzzer_ON_error_Pause;
				else
					if(buzzer.state == E_Buzzer_ON_error_Pause)
						buzzer.state = E_Buzzer_On_error;
				buzzer.counter = 0;
			}
		}
		if(buzzer.state == E_Buzzer_On_once)
		{
			buzzer.counter ++;

			BUZZER_PORT->ODR ^= BUZZER_PIN;
			if(buzzer.counter > BUZZER_MAX_COUNTER)
			{
				BUZZER_PORT->ODR |= BUZZER_PIN;
				buzzer.counter = 0;
				buzzer.state = E_Buzzer_Off;
			}
		}
		BUZZER_TIMER->SR = 0;
	}
}
